public class test4 {
    // 力扣 260 只出现一次的数字III
    public int[] singleNumber(int[] nums) {
        int xorsum = 0;
        for (int n : nums) {
            xorsum ^= n;
        }
        // 获取两个只出现一次的数异或后的值的最低位的1（即最低位（标记为d位）不相同的数）
        // 即提取最右边的1
        int lsb = (xorsum == Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));
        // 根据这个数可以将nums数组分成两类
        // 一类：d位为1的数
        // 二类：d位为0的数
        int a = 0, b = 0;
        for (int n : nums) {
            //(n & lsb) != 0 这里一定是！=0 不能换成== 1，因为它这里只有0和非0的区别
            //但可能会有1，2，3等等
            if ((n & lsb) == 0) {
                a ^= n;
            } else {
                b ^= n;
            }
        }
        return new int[] { a, b };
    }
}
